package main

import (
	"fmt"
	"sync"
)

// 需求：现在要计算 1-200 的各个数的阶乘，并且把各个数的阶乘放入到map中，最后显示出来。要求使用 goroutine 完成。

// 思路
// 1 编写一个函数，来计算各个数的阶乘，并放入到 map中。
// 2 启动多个协程，统计结果放入到 map 中。
// 3 map 应该做成一个全局的。

var (
	myMap = make(map[int]int, 1)
	// 声明一个全局的互斥锁
	// lock：一个全局的互斥锁。
	// sync：包，用于同步（synchornized）。
	// Mutex：互斥
	lock sync.Mutex
)

// test 函数就是计算 n!, 并将这个结果放入到 myMap 中。
func test(n int) {
	res := 1
	for i := 1; i <= n; i++ {
		res *= i
	}
	// 将 res 放入到 myMap。
	// 加锁
	lock.Lock()
	myMap[n] = res // concurrent map writes
	// 解锁
	lock.Unlock()
}

func main() {
	// 开启多个协程完成这个任务
	for i := 1; i <= 20; i++ {
		go test(i)
	}

	// 休眠10秒钟，不是一个好的解决方案
	//time.Sleep(time.Second * 5)
	// 输出结果,遍历这个结果
	lock.Lock()
	for i, v := range myMap {
		fmt.Printf("map[%d]=%d\n", i, v)
	}
	lock.Unlock()
}
